package Controllers;

import Configs.Config;
import GUIs.f_nhanvien_nguoithue_sua;
import GUIs.f_nhanvien_nguoithue_them;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
import com.db4o.query.Query;
import java.awt.Component;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import models.GioiTinh;
import models.NguoiThue;

public class NguoiThueController {

    private final Config conn;
    private BieuThucChinhQuy btcq;

    public NguoiThueController(Config conn) {
        this.conn = conn;
    }

    public NguoiThue getWithCMND(String cmnd) {
        ObjectContainer db = this.conn.getConn();
        return db.query(new Predicate<NguoiThue>() {
            @Override
            public boolean match(NguoiThue nhanvien) {
                return (nhanvien.getCMND().equals(cmnd));
            }
        }).next();
    }

    public void Show(JTable tbnguoithue, String txttim) {
        DefaultTableModel model = (DefaultTableModel) tbnguoithue.getModel();
        Query query = this.conn.getConn().query();
        int stt = 0;
        if (txttim == null) {
            query.constrain(NguoiThue.class);
            query.descend("isDel").constrain(false).equal();
            ObjectSet<NguoiThue> nguoithues = query.execute();
            for (NguoiThue nguoithue : nguoithues) {
                Object[] row = {++stt, nguoithue.getCMND(), nguoithue.getHoten(), nguoithue.getGioitinh(), nguoithue.getCongviec()};
                model.addRow(row);
            }
        } else {
            query.constrain(NguoiThue.class);
            query.descend("CMND").constrain(txttim).like().endsWith(true).startsWith(true).or(query.descend("hoten").constrain(txttim).like().endsWith(true).startsWith(true));
            query.descend("isDel").constrain(false).equal();
            ObjectSet<NguoiThue> nguoithues = query.execute();
            for (NguoiThue nguoithue : nguoithues) {
                Object[] row = {++stt, nguoithue.getCMND(), nguoithue.getHoten(), nguoithue.getGioitinh(), nguoithue.getCongviec()};
                model.addRow(row);
            }
        }

        try {
            int numRows = tbnguoithue.getRowCount();
            for (int row = 0; row < numRows; row++) {
                int rowHeight = tbnguoithue.getRowHeight();
                int numCols = tbnguoithue.getColumnCount();
                for (int column = 0; column < numCols; column++) {
                    Component comp = tbnguoithue.prepareRenderer(tbnguoithue.getCellRenderer(row, column), row, column);
                    rowHeight = Math.max(rowHeight, comp.getPreferredSize().height) + 5;
                }
                tbnguoithue.setRowHeight(row, rowHeight);
            }
        } catch (ClassCastException e) {
        }
    }

    public boolean Add(f_nhanvien_nguoithue_them them_nguoithue) {
        String cmnd = them_nguoithue.tfcmnd.getText();
        String hoten = XuLyChuoi.inHoaChuDauChuoi(them_nguoithue.tfhoten.getText());
        String gioitinh = them_nguoithue.cbbgioitinh.getSelectedItem().toString();
        Date ngaysinh = them_nguoithue.dpngaysinh.getDate();
        String sdt = them_nguoithue.tfsdt.getText();
        String congviec = XuLyChuoi.inHoaChuDauChuoi(them_nguoithue.textareacongviec.getText());

        this.btcq = new BieuThucChinhQuy(cmnd, "^[0-9]{9,15}$");
        if (!this.btcq.isBoolean()) {
            JOptionPane.showMessageDialog(them_nguoithue, "CMND không hợp lệ.\nCảnh báo: CMND chỉ chứa các ký tự số [0-9] dài trong khoảng [9-15] ký tự.", "Thông báo", JOptionPane.ERROR_MESSAGE);
            them_nguoithue.tfcmnd.requestFocus();
        } else {
            this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
            this.btcq.setChuoikt(hoten);
            if (!this.btcq.isBoolean()) {
                JOptionPane.showMessageDialog(them_nguoithue, "Họ tên không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                them_nguoithue.tfhoten.requestFocus();
            } else if (gioitinh.equals("Chọn")) {
                JOptionPane.showMessageDialog(them_nguoithue, "Vui lòng chọn giới tính người thuê.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                them_nguoithue.cbbgioitinh.requestFocus();
            } else if (!DateNTime.checkTuoi(ngaysinh)) {
                JOptionPane.showMessageDialog(them_nguoithue, "Ngày tháng năm sinh không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                them_nguoithue.dpngaysinh.requestFocus();
            } else {
                this.btcq.setBtchinhquy("^[0-9]{9,15}$");
                this.btcq.setChuoikt(sdt);
                if (!this.btcq.isBoolean()) {
                    JOptionPane.showMessageDialog(them_nguoithue, "Số điện thoại không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                    them_nguoithue.tfsdt.requestFocus();
                } else {
                    this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                    this.btcq.setChuoikt(congviec);
                    if (!this.btcq.isBoolean()) {
                        JOptionPane.showMessageDialog(them_nguoithue, "Công việc không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                        them_nguoithue.textareacongviec.requestFocus();
                    } else {
                        ObjectSet<NguoiThue> conflicts = this.conn.getConn().query(new Predicate<NguoiThue>() {

                            @Override
                            public boolean match(NguoiThue et) {
                                return et.getCMND().equals(cmnd);
                            }
                        });
                        if (conflicts.size() == 0) {
                            NguoiThue themmoi = new NguoiThue(cmnd, hoten, (gioitinh.equals("Nam")) ? GioiTinh.Nam : GioiTinh.Nữ, sdt, ngaysinh);
                            themmoi.setCongviec(congviec);
                            this.conn.getConn().store(themmoi);
                            return true;
                        } else {
                            JOptionPane.showMessageDialog(them_nguoithue, "CMND này trùng với một người khác trong CSDL.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                            them_nguoithue.tfcmnd.requestFocus();
                        }
                    }
                }
            }
        }
        return false;
    }

    public boolean Edit(f_nhanvien_nguoithue_sua sua_nguoithue) {
        String cmnd = sua_nguoithue.tfcmnd.getText();
        String hoten = XuLyChuoi.inHoaChuDauChuoi(sua_nguoithue.tfhoten.getText());
        String gioitinh = sua_nguoithue.cbbgioitinh.getSelectedItem().toString();
        Date ngaysinh = sua_nguoithue.dpngaysinh.getDate();
        String sdt = sua_nguoithue.tfsdt.getText();
        String congviec = XuLyChuoi.inHoaChuDauChuoi(sua_nguoithue.textareacongviec.getText());

        this.btcq = new BieuThucChinhQuy(hoten, "[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
        if (!this.btcq.isBoolean()) {
            JOptionPane.showMessageDialog(sua_nguoithue, "Họ tên không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
            sua_nguoithue.tfhoten.requestFocus();
        } else if (gioitinh.equals("Chọn")) {
            JOptionPane.showMessageDialog(sua_nguoithue, "Vui lòng chọn giới tính người thuê.", "Thông báo", JOptionPane.ERROR_MESSAGE);
            sua_nguoithue.cbbgioitinh.requestFocus();
        } else if (!DateNTime.checkTuoi(ngaysinh)) {
            JOptionPane.showMessageDialog(sua_nguoithue, "Ngày tháng năm sinh không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
            sua_nguoithue.dpngaysinh.requestFocus();
        } else {
            this.btcq.setBtchinhquy("^[0-9]{9,15}$");
            this.btcq.setChuoikt(sdt);
            if (!this.btcq.isBoolean()) {
                JOptionPane.showMessageDialog(sua_nguoithue, "Số điện thoại không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                sua_nguoithue.tfsdt.requestFocus();
            } else {
                this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                this.btcq.setChuoikt(congviec);
                if (!this.btcq.isBoolean()) {
                    JOptionPane.showMessageDialog(sua_nguoithue, "Công việc không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                    sua_nguoithue.textareacongviec.requestFocus();
                } else {
                    NguoiThue edit = this.conn.getConn().query(new Predicate<NguoiThue>() {
                        @Override
                        public boolean match(NguoiThue et) {
                            return et.getCMND().equals(cmnd);
                        }
                    }).next();
                    edit.setHoten(hoten);
                    edit.setGioitinh((gioitinh.equals("Nam")) ? GioiTinh.Nam : GioiTinh.Nữ);
                    edit.setNgaysinh(ngaysinh);
                    edit.setSdt(sdt);
                    edit.setCongviec(congviec);
                    this.conn.getConn().store(edit);
                    return true;
                }
            }
        }
        return false;
    }

    public boolean Delete(String cmnd) {
        ObjectSet<NguoiThue> xoa = this.conn.getConn().query(new Predicate<NguoiThue>() {

            @Override
            public boolean match(NguoiThue et) {
                return et.getCMND().equals(cmnd);
            }
        });

        while (xoa.hasNext()) {
            NguoiThue nguoiThue = xoa.next();
            if (nguoiThue.getDshopdong().isEmpty()) {
                this.conn.getConn().delete(nguoiThue);
            } else {
                nguoiThue.setIsDel(true);
                this.conn.getConn().store(nguoiThue);
            }
        }

        return true;
    }
}
